TScrollBox - prekreslovanie ScrollBar

Otázka od: Ing. Marian Müller

5. 12. 2002 6:53

Ahojte,

mam ScrollBox a na nom vytvorenych 10x TButton pod sebou tak, ze 2 z nich
zasahuju pod okraj ScrollBoxu a teda sa vytvory ScrollBar, kedze ma
nastaveny AutoScroll:=true. Vsetko je v poriadku az do okamihu, ked v
programe vyvolam nejaky dalsi form.ShowModal. Ten novo vytvoreny form je
maly, da sa s nim pohybovat a ked nim prejdem ponad ten vytvoreny ScrollBar,
tak sa uz neprekresli, alebo iba ciastocne. Aj po uzatvoreni vrchneho okna
(ModalResult:=mrOK) sa nic neudeje a ScrollBar je neprekresleny -
"neviditelny". Moznosti obnovy su: prepnut na inu aplikaciu (prekryt cudzim
oknom) a potom naspat, alebo zmenit velkost toho okna a tym aj donutit k
prekresleniu ScrollBox.
Nepomaha ani Update, Refresh, dokonca ani Invalidate.

Pre zakaznika je vsak neprijatelne vysvetlovanie a prikazanie, ze musi okno
prekryt, alebo zmenit jeho velkost...  

Neriesil uz nahodou niekto takyto problem?

Dik,
Marian.
D6 prof, Win2000.

Odpovedá: Lebeda David

5. 12. 2002 8:27

> Nepomaha ani Update, Refresh, dokonca ani Invalidate.
>
> Pre zakaznika je vsak neprijatelne vysvetlovanie a prikazanie, ze musi
> okno prekryt, alebo zmenit jeho velkost...  

Ahoj,

o tom problemu sice nic blizsiho nevim, ale jelikoz zatim nikdo
neodpovedel, tak me napada takovahle berlicka: co kdyby misto
Refresh jsi zkusil Width snizit o 1 a zase zvysit o 1, neboli simuloval
zmenu velikosti, jak pises?

To, ze nepomuze Update, me celkem prekvapuje - volas metodu
Update formu nebo ScrollBoxu?

David Lebeda

Odpovedá: Ing. Marian Muller

5. 12. 2002 9:25

>To, ze nepomuze Update, me celkem prekvapuje - volas metodu
>Update formu nebo ScrollBoxu?

Spominane metody Update, Refresh a Invalidate som skusal u toho ScrollBoxu
no neuspesne. Menit velkost je mozno dobry napad, ale neviem do akej
udalosti by sa to mohlo vlozit. Myslel so ze do Form1.OnActivate, ale tato
udalost sa nevyvolava po prikazoch Form2.ShowModal. A davat to rucne na
kazde take miesto kde vyvolavam modalne novy form sa mi nezda velmi OK. Ak
by ta "virtualna" zmena velkosti pomohla, tak je nejaka udalost, ktora sa
vyvola vzdy po uzatvoreni vyvolaneho modalneho okna?

Marian.


Odpovedá: Lebeda David

5. 12. 2002 9:50

> Spominane metody Update, Refresh a Invalidate som skusal u toho
> ScrollBoxu no neuspesne.

Zkusil bych to az na urovni formu.

 Menit velkost je mozno dobry napad, ale
> neviem do akej udalosti by sa to mohlo vlozit.

Myslel jsem misto volani Update, mel jsem za to, ze hotam nekde mas.

Ale zkus se podivat na property a udalosti objektu TScreen, ktery je globalni
podobne jako TApplication. Ma property tusim ActiveForm a udalosti vyvolavajici
se
po kazde zmene focusu i aktivniho formu. Tam bys mohl zachytit leccos.

David Lebeda

Odpovedá: Ing. Marian Muller

5. 12. 2002 11:33

> podobne jako TApplication. Ma property tusim ActiveForm a udalosti
vyvolavajici se
> po kazde zmene focusu i aktivniho formu. Tam bys mohl zachytit leccos.

Vdaka, mal si pravdu, v Screen je udalost OnActiveFormChange a ta funguje
bez problemov aj po kazdom ShowModal. Takze udalost uz mam, a dokonca
funguje aj Width+1, Width-1 priamo len u toho ScrollBoxu. Lenze toto ma zase
tu zlu vlastnost, ze zmenou velkosti ScrollBoxu sa prekresli cely objekt a
to urobi nepekne bliknutie. Neda sa donutit obnovit nejako priamo iba jeho
ScollBar?


Marian.